/* 
 * Autores:
 *      Jonathan Lopez  11106
 *      Jorge Martínez  11237
 * 
 * Archivo: Informador.java
 * Última Revision: $Rev: 64 $
 *      Fecha: $Date: 2011-09-18 02:32:49 +0000 (Sun, 18 Sep 2011) $
 */ 

package Archivador;

import java.util.HashMap;
import java.util.Scanner;
import java.io.File;
import java.io.PrintWriter;
import java.io.FileWriter;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Esta clase contiene información de inicio que puede ser accesada por
 * cualquier clase.
 * 
 * @author Jonathan Lopez
 * @author Jorge Martinez
 */
public class Informador {
    
    private static final HashMap<String,String> datosInicio =
            new HashMap<String,String>();
    private static final String nombreArchivo = "data.ini";
    
    /**
     * Devuelve el valor asociado con la clave dada. Si no existe tal
     * clave entonces devuelve null
     * @param clave Clave contenida en el archivo data.ini
     * @return dato (String) o null si no existe
     */
    public static String obtenerDato( String clave ){
        return datosInicio.get( clave );
    }
    
    /**
     * Devuelve todas las claves encontradas en el archivo de inicio data.ini
     * @return claves (String[])
     */
    public static String[] obtenerClaves(){
        String [] claves = datosInicio.keySet().toArray(new String[0]);
        return claves;
    }
    
    /**
     * Cambia el dato asociado a una clave. Si la clave no existe es creada
     * y agregada al listado.
     * @param clave clave con el dato relacionado
     * @param dato nuevo dato
     * @return regresa el dato con el que estaba relacionado anteriormente la
     * clave (String)
     */
    public static String cambiarDato( String clave, String dato ){
        return datosInicio.put( clave, dato );
    }
    
    /**
     * Guarda todos los cambios realizados en el archivo "data.ini"
     */
    public static void guardarCambios(){
        try{
            FileWriter archivo = new FileWriter( nombreArchivo, false );
            PrintWriter escritor = new PrintWriter( archivo );
            
            String[] claves = obtenerClaves();
            for( String actual: claves ){
                String linea = actual + " " + obtenerDato(actual);
                escritor.println( linea );
            }
            escritor.flush();
            
        } catch ( IOException e ){
            // TODO: Poner una entrade en el log
            // System.out.println("ERROR: No se pudo escribir al archivo data.ini");
        }
        
    }
    
    /**
     * Lee el archivo de datos y los pone a disposición del programa
     */
    static{
        try{
            File datos = new File( nombreArchivo );
            Scanner lector = new Scanner( datos );
            
            while( lector.hasNextLine() ){
                String linea = lector.nextLine();
                String[] parDatos = linea.split( " ", 2 );
                
                if( parDatos.length == 2 )
                    datosInicio.put( parDatos[0], parDatos[1] );
                else
                    System.out.println("No se pudo interpretar linea: " + 
                            linea );
            }
            
        } catch ( FileNotFoundException e ) {
            System.out.println("**ERROR**: No se encontro el archivo data.ini");
        }
    }
    
    /**
     * Punto de entrada para probar la funcionalidad de la clase Informador.java
     * @param args
     */
    public static void main( String [] args ){
        String[] clavesDeInicio = Informador.obtenerClaves();
        System.out.println("TOTAL CLAVES: " + clavesDeInicio.length );
        
        for( String clave: clavesDeInicio ){
            System.out.println("Clave: " + clave + " - " +
                    Informador.obtenerDato(clave) );
        }
        
        Informador.cambiarDato("indice", "1" );
        Informador.cambiarDato("prueba", "una prueba de pruebas");
        Informador.cambiarDato("dato", "otro dato");
        Informador.cambiarDato("numero", "5" );
        
        Informador.guardarCambios();
    }
}
